#pragma once
#include<iostream>
#include<functional>
#include<cstdio>
#include<ctime>
#include<string>
#include<map>
#include<fstream>
#include"log.hpp"
#include<unistd.h>
void ServerIO(int sockfd)
{
    char buffer[1024];
    while (true)
    {
        ssize_t n = read(sockfd, buffer, sizeof(buffer));
        // 我们就跟读文件一样！就将数据读取出来了！——为什么udp不是？
        // 因为udp不符合文件特性！——文件也是面向字节流的，和管道也是一样！udp是面向数据报的！要用特殊函数来读
        if (n > 0)
        {
            buffer[n] = 0; // 我们目前把读取到的数据当做是字符串！
            std::cout << "recv message: " << buffer << std::endl;

            // 服务端将数据发送回去！
            std::string outbuffer = buffer;
            // 如何发送回去？——就是写入文件！write

            write(sockfd, outbuffer.c_str(), outbuffer.size());
        }
        else if (n == 0)
        {
            // read的返回值，在文件中返回值为0，意味着读取到文件尾
            // 在网络中，返回值为0，意味着client端退出！
            LogMessage(NORMAL, "client quit ! me too!");
            break;
        }
    }
    close(sockfd);//在内部关闭套接字即可！
    //像是这种任务是一个死循环！如果不退那么线程池的线程会越来越少！所以其实是不合适的！
    //像这种任务其实是不适合线程池处理的！——它一定是很短很快速！一请求就立马相应的任务！然后将执行后将线程归还！
}
class Task
{
    using func_t = std::function<void(int)>;
public:
    Task()
    {}
    Task(const int &sock,func_t callback)
        : sock_(sock),callback_(callback)
    {
    }
    void operator()()
    {
        callback_(sock_);
    }

private:
    func_t callback_;
    int sock_;
};
